home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / online / source / c / compilers / Bob 1.5.sit.hqx / Bob 1.5 / Bob.c next >
C/C++ Source or Header  |  1993-10-02  |  3KB  |  141 lines

  1. /* bob.c - the main routine */
  2. /*
  3.     Copyright (c) 1991, by David Michael Betz
  4.     All rights reserved
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdarg.h>
  9. #include <setjmp.h>
  10. #include "bob.h"
  11.  
  12. #ifdef MACINTOSH
  13. #include <console.h>
  14. #endif
  15.  
  16. /* Revision history
  17.  
  18.     1.0    08/15/91    Initial version for DDJ article.
  19.     1.1    08/20/91    Fixed do_for to allow null statements.
  20.     1.2    08/28/91    Fixed problem with newobject().
  21.     1.3    09/27/91    Fixed a bug in compact_vector().
  22.     1.4    10/09/91    Reworked for Windows 3 - part 1.
  23.     1.5    10/12/91    Various bug fixes.  Added gc().
  24. */
  25.  
  26. #define BANNER    "Bob v1.5 - Copyright (c) 1991, by David Betz"
  27.  
  28. /* global variables */
  29. jmp_buf error_trap;
  30. char **bobargv;
  31. int bobargc;
  32.  
  33. /* external variables */
  34. extern int decode,trace;
  35. extern VALUE symbols;
  36. extern VALUE stdin_iostream;
  37. extern VALUE stdout_iostream;
  38. extern VALUE stderr_iostream;
  39.  
  40. /* forward declarations */
  41. #ifdef __STDC__
  42. static void compile_file(char *);
  43. static void add_file(char *,FILE *,VALUE *);
  44. #endif
  45.  
  46. /* main - the main routine */
  47. main(int argc, char *argv[])
  48. {
  49.     char fullname[20];
  50.     int i;
  51.  
  52.     /* display the banner */
  53.     osputs(BANNER);
  54.     osputs("\n");
  55.  
  56. #ifdef MACINTOSH
  57.     argc = ccommand(&argv);
  58. #endif
  59.  
  60.     /* initialize */
  61.     initialize(SMAX);
  62.     init_compiler();
  63.     bobargc = argc - 1;
  64.     bobargv = argv + 1;
  65.  
  66.     /* setup the standard i/o streams */
  67.     add_file("stdin",stdin,&stdin_iostream);
  68.     add_file("stdout",stdout,&stdout_iostream);
  69.     add_file("stderr",stderr,&stderr_iostream);
  70.  
  71.     /* load and execute some code */
  72.     for (i = 1; i < argc; ++i)
  73.     if (strcmp(argv[i],"-d") == 0)
  74.         decode = 1;
  75.     else if (strcmp(argv[i],"-t") == 0)
  76.         trace = 1;
  77.     else {
  78.         strcpy(fullname,argv[i]);
  79.         strcat(fullname,".bob");
  80.         compile_file(fullname);
  81.     }
  82.     if (!execute("main"))
  83.     printf("Error: executing 'main'\n");
  84. }
  85.  
  86. /* compile_file - compile definitions in a file */
  87. static void compile_file(name)
  88.   char *name;
  89. {
  90.     FILE *ifp;
  91.     if ((ifp = fopen(name,"r")) != NULL) {
  92.     compile_definitions(fgetc,ifp);
  93.     fclose(ifp);
  94.     }
  95. }
  96.  
  97. /* info - display progress information */
  98. void info(char *fmt, ...)
  99. {
  100.     char buf1[100],buf2[100];
  101.     va_list args;
  102.  
  103.     va_start(args, fmt);
  104.     vsprintf(buf1,fmt,args);
  105.     va_end(args);
  106.     sprintf(buf2,"[ %s ]\n",buf1);
  107.     osputs(buf2);
  108. }
  109.  
  110. /* error - print an error message and exit */
  111. void error(char *fmt, ...)
  112. {
  113.     char buf1[100],buf2[100];
  114.     va_list args;
  115.  
  116.     va_start(args,fmt);
  117.     vsprintf(buf1,fmt,args);
  118.     va_end(args);
  119.     sprintf(buf2,"Error: %s\n",buf1);
  120.  
  121.     osputs(buf2);
  122.     longjmp(error_trap,1);
  123. }
  124.  
  125. void osputs(str)
  126.   char *str;
  127. {
  128.     fputs(str,stderr);
  129. }
  130.  
  131. /* add_file - add a built-in file */
  132. static void add_file(name,fp,pval)
  133.   char *name; FILE *fp; VALUE *pval;
  134. {
  135.     extern IODISPATCH fileio;
  136.     DICT_ENTRY *sym;
  137.     sym = addentry(&symbols,name,ST_SDATA);
  138.     set_iostream(&sym->de_value,newiostream(&fileio,fp));
  139.     *pval = sym->de_value;
  140. }
  141.